package com.bbva.kyfb.kyfbdaofi;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.bbva.jee.arq.spring.core.gce.ExcepcionEjecucionAplicacion;
import com.bbva.kyfb.kyfbdto.firmas.bo.FicheroInfo;
import com.bbva.kyfb.kyfbdto.firmas.filtros.FiltroFicheros;
import com.bbva.kyfb.kyfbjpatlbh.dominiotlbh.Ttlsbfua;
import com.bbva.kyfb.kyfbjpatlbh.dominiotlbh.Ttlsbont;
import com.bbva.kyfb.kyfbjpatlsb.dominiotlsb.Ttlsbffs;
import com.bbva.kyfb.kyfbjpatlsb.dominiotlsb.Ttlsbfrf;

/**
 * The Interface IFirmasDao.
 */
public interface IFirmasDao {

	/**
	 * Find componentes pdte referencia.
	 *
	 * @param codClienteCash the cod cliente cash
	 * @param filtro the filtro
	 * @param ordenante the ordenante
	 * @return the list
	 */
	public List<Object[]> findComponentesPdteReferencia(String codClienteCash, String codigoAplicacion, FiltroFicheros filtro, boolean ordenante);

	/**
	 * get total componentes pdte referencia.
	 *
	 * @param codClienteCash the cod cliente cash
	 * @param filtro the filtro
	 * @param ordenante the ordenante
	 * @return the total
	 */
	public int getTotalComponentesPdtesReferencia(String codClienteCash, String codigoAplicacion,FiltroFicheros filtro, boolean ordenante);

	/**
	 * get total componentes pdte referencia Host.
	 *
	 * @param codClienteCash the cod cliente cash
	 * @param filtro the filtro
	 * @param ordenante the ordenante
	 * @return the total
	 */
	public int getTotalComponentesPdtesReferenciaHost(String codClienteCash, String codigoAplicacion,FiltroFicheros filtro, boolean ordenante, final String[] timFicheros);


	/**
	 * Find auditoria componente pdte.
	 *
	 * @param codClienteCash the cod cliente cash
	 * @param claseOrden the clase orden
	 * @param idOrden the id orden
	 * @param estados the estados
	 * @return the list
	 */
	public List<Ttlsbfua> findAuditoriaComponentePdte(String codClienteCash, String claseOrden, String idOrden, String[] estados);

	/**
	 * Find firmables aplicacion.
	 *
	 * @param codApp the cod app
	 * @return the list
	 */
	public List<Object[]> findFirmablesAplicacion(String codApp);

	/**
	 * Find huso horario.
	 *
	 * @param claseOrd the clase ord
	 * @return the list
	 */
	public List<Object[]> findHusoHorario(String[] claseOrd);

	/**
	 * Find validacion.
	 *
	 * @param codValidacion the cod validacion
	 * @return the list
	 */
	public List<Object[]> findValidacion(String codValidacion);

	/**
	 * Update estado fichero.
	 *
	 * @param estado the estado
	 * @param codClienteCash the cod cliente cash
	 * @param claseOrden the clase orden
	 * @param idOrden the id orden
	 */
	public void updateEstadoFichero(String estado, String codClienteCash, String claseOrden, String idOrden);

	/**
	 * Update peso estado firma.
	 *
	 * @param estado the estado
	 * @param peso the peso
	 * @param codClienteCash the cod cliente cash
	 * @param claseOrden the clase orden
	 * @param idOrden the id orden
	 */
	public void updatePesoEstadoFirma(String estado, Double peso,String codClienteCash, String claseOrden, String idOrden);

	// TODO:DTO PARA USUARIO FIRMANTE
	/**
	 * Insert firmante.
	 *
	 * @param firmante the firmante
	 */
	public void insertFirmante(Ttlsbffs firmante);

	/**
	 * Inserta un registro en la tabla de FFS
	 * 
	 * @param firmante el firmante a insertar en la FFS
	 */
	public void insertFFS(final Ttlsbffs firmante);

	/**
	 * Insert auditoria firma.
	 *
	 * @param fua the fua
	 */
	public void insertAuditoriaFirma(Ttlsbfua fua);

	/**
	 * Update bit.
	 *
	 * @param codCanal the cod canal
	 * @param bancoInt the banco int
	 * @param logon the logon
	 * @param numItem the num item
	 */
	public void updateBit(String codCanal, String bancoInt, String logon, BigDecimal numItem) ;

	/**
	 * Update bit delete.
	 *
	 * @param codCanal the cod canal
	 * @param bancoInt the banco int
	 * @param logon the logon
	 * @param numItem the num item
	 */
	public void updateBitDelete(String codCanal, String bancoInt, String logon, BigDecimal numItem);

	/**
	 * Find eoo by ord.
	 *
	 * @param tipoOrden the tipo orden
	 * @param campo the campo
	 * @return the string
	 */
	public String findEOOByOrd(String tipoOrden, String campo);

	/**
	 * Find ool by id.
	 *
	 * @param identificador the identificador
	 * @return the string
	 */
	public String findOOLById(double identificador);

	/**
	 * Find producto by cod prod and cod idom.
	 *
	 * @param codigoProducto the codigo producto
	 * @param codigoIdioma the codigo idioma
	 * @return the list
	 */
	public List<Object[]> findProductoByCodProdAndCodIdom(Integer codigoProducto, Integer codigoIdioma);

	/**
	 * Find cod producto by clase ord.
	 *
	 * @param claseOrd the clase ord
	 * @return the map
	 */
	public Map<String, String> findCodProductoByClaseOrd(String claseOrd);

	/**
	 * Find clase ord by cod producto.
	 *
	 * @param codServicios the cod servicios
	 * @param codCanal the cod canal
	 * @param codBancoInt the cod banco int
	 * @return the map
	 * @paran codCanal codigo del canal
	 * @paran codBancoInt codigo del baco interno
	 */
	public Map<String, String> findClaseOrdByCodProducto(String[] codServicios, String codCanal, String codBancoInt);

	/**
	 * Find firmas realizas.
	 *
	 * @param idOrden the id orden
	 * @param tipoOrden the tipo orden
	 * @param codClienteCash the cod cliente cash
	 * @return the list
	 */
	public List<Object[]> findFirmasRealizas(String idOrden, String tipoOrden, String codClienteCash);

	/**
	 * Delete firmantes.
	 *
	 * @param qnuItem the qnu item
	 * @param timFichero the tim fichero
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	public void deleteFirmantes(String qnuItem, Date timFichero)
			throws ExcepcionEjecucionAplicacion;

	/**
	 * Find objetos firmables por aplicacion.
	 *
	 * @param codAplicaci the cod aplicaci
	 * @return the list
	 */
	public List<Object[]> findObjetosFirmablesPorAplicacion(String codAplicaci);

	/**
	 * Count num auditoria.
	 *
	 * @param codClienteCash the cod cliente cash
	 * @param tipoOrden the tipo orden
	 * @param idOrden the id orden
	 * @param codAccion the cod accion
	 * @return the int
	 */
	public int countNumAuditoria(String codClienteCash, String tipoOrden, String idOrden, short codAccion);

	/**
	 * Find firmables aplicacion firm.
	 *
	 * @param codApp the cod app
	 * @return the list
	 */
	public List<Object[]> findFirmablesAplicacionFirm(String codApp);

	/**
	 * Busca ficheros firmados por el usuario.
	 *
	 * @param fichero the fichero
	 * @return the list
	 */
	public List<String> findFirmasRealizasByUsuario(FicheroInfo fichero);

	/**
	 * Find componentes pdte referencia tim fichero.
	 *
	 * @param clasesOrd the clases ord
	 * @param timFicheros the tim ficheros
	 * @return the list
	 */
	public List<Object[]> findComponentesPdteReferenciaTimFichero(
			String codClienteCash, String codigoAplicacion,
			FiltroFicheros filtro, boolean ordenante, String[] timFicheros);

	/**
	 * Find componentes pdte referencia tim fichero.
	 *
	 * @param clasesOrd the clases ord
	 * @param timFicheros the tim ficheros
	 * @return the list
	 */
	public int countComponentesPdteReferenciaTimFichero(
			String codClienteCash, String codigoAplicacion,
			FiltroFicheros filtro, boolean ordenante, String[] timFicheros);

	/**
	 * Devuelve un Map con los tipos de cambio de las diferentes divisas frente al EUR.
	 *
	 * @param codBancoInterno the codBancoInterno
	 * @return the Map [(EUR, 1.000), (USD, 1.37) ...]
	 */
	public Map<String, Double> findTiposDeCambio(int codBancoInterno);

	/**
	 * Devuelve un Map con la conversion entre codigo de servicio local y codigo de servicio global.
	 *
	 * @param codBancoInterno the codBancoInterno
	 * @return the Map [(343, 8343), (654, 8654), ...]
	 */
	public Map<String, String> findCodServicioGlobal(int codBancoInterno);

	/**
	 * Find componentes pdte referencia usuario.
	 *
	 * @param codClienteCash the cod cliente cash
	 * @param filtro the filtro
	 * @param ordenante the ordenante
	 * @return the list
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	public List<Object[]> findComponentesPdteReferenciaUsuario(String codClienteCash, String codigoAplicacion, FiltroFicheros filtro, boolean ordenante) throws ExcepcionEjecucionAplicacion;

	/**
	 * Devuelve una lista de arrays de string con si se debe o no mostrar el mensaje y el mensaje en si.
	 * 
	 * @param codTipoOrden el codTipoOrden del fichero
	 * @param codgio de aplicacion
	 * @return Lista [S/N,Mensaje]
	 */
	List<String[]> findMensajeAceptacion(String codAplicacion, String[] arrCodTipoOrden);

	/**
	 * Devuelve la lista de usuarios que tienen firma previa para ese codigo de tipo de orden
	 * @param codTipoOrden
	 * @param arrCodNameFrmts
	 * @return
	 */
	List<String> findCodUsuFirmaPrevia(String codTipoOrden, String[] arrCodNameFrmts);

	/**
	 * Devuelve la lista de usuarios que tienen firma previa para ese codigo de tipo de orden
	 * @param codTipoOrden
	 * @param arrCodNameFrmts
	 * @return
	 */
	List<String> findTipOrdFirmaPrevia(String codNameFrmt, String[] arrCodTipoOrden);

	/**
	 * Devuelve una lista con los codigos de mensaje aceptacion y si hay que mostrarlos
	 * 
	 * @param qnuItem el qnuItem del fichero
	 * @param referencia la referencia del fichero
	 * @return la Map [(codUsuario1, numAleatorio1), (codUsuarioN, numAleatorioN), ...]
	 */
	Map<String, String> findUsuariosNumAleatorio(BigDecimal qnuItem, String referencia);

	/**
	 * Devuelve un Map con la relacion entre qnuItem y numeros aleatorios
	 * 
	 * @param codUsuario el codigo de usuario del fichero
	 * @param referencia la referencia del fichero
	 * @return la Map [(qnuItem1, numAleatorio1), (qnuItemN, numAleatorioN), ...]
	 */
	public Map<String, String> findFicherosNumAleatorio(final String codUsuario, final String referencia);

	/**
	 * Realiza la actualizacion del numero aleatorio en la tabla FFS
	 * 
	 * @param firmante los datos necesarios para la sentencia Update
	 */
	public void updateNumAleatorioFFS(final Ttlsbffs firmante);

	/**
	 * Inserta un registro en la tabla de FRF
	 * 
	 * @param firmante el firmante a insertar en la FRF
	 */
	public void insertFRF(final Ttlsbfrf firmante);

	/**
	 * Realiza la actualizacion del numero aleatorio en la tabla FRF
	 * 
	 * @param firmante los datos necesarios para la sentencia Update
	 */
	public void updateNumAleatorioFRF(final Ttlsbfrf firmante);

	/**
	 * Devuelve la hash del numero aleatorio de la FRF
	 * @param timFichero
	 * @return
	 */
	public Map<String, String> findNumAleatorioFRF(final String timFichero);

	/**
	 * Devuelve la hash del numero aleatorio de la FRF por nif de usuario
	 * @param documentoUsuario documento del usuario
	 * @return map
	 */
	public Map<String, String> findNumAleatorioFRFbyUsuario(final String documentoUsuario);

	/**
	 * borra en la tabla FRF
	 * @param nif
	 * @param ficheroBorrado
	 */
	public void deleteFirmantesFRF(final String nif, final Date ficheroBorrado);

	/**
	 * Inserta en la tabla ONT
	 * @param ont
	 */
	public void insertDisclaimer(Ttlsbont ont);

	/**
	 * Count num auditoria.
	 *
	 * @param referencia
	 * @param codUsuario
	 * @param xsnAvisnoti
	 * @return int
	 */
	public int countNumNotificacion(String referencia, String codUsuario, String xsnAvisnoti);

	/**
	 * insertAuditoria
	 * 
	 * @param aud
	 */
	public void insertAuditoria(Ttlsbfua aud);

}
